package adke.gui;

import adke.Util;
import adke.gui.panels.GamePanel;
import adke.gui.panels.Init;
import adke.gui.panels.ScoreHolderPanel;
import adke.settings.Settings;
import java.awt.Dimension;

// java
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class Overview extends JFrame //JWindow // geen border
{
    // kiezen van spelers etc
    public final static int STATE_SETUP =           0;
    // tijdens hets pelen
    public final static int STATE_INGAME =          1;
    // als de ronde klaar is en er is een duidelijke winnaar
    public final static int STATE_ROUND_FINISH =    2;
    // als de game klaar is
    public final static int STATE_GAME_FINISH =     3;
    
    // geeft aan of we spelers aan het kiezen zijn, of al aan het spelen zijn
    // dit is handig om te weten zodat de KeyListeners weten waar ze naar moeten luisteren
    private static int STATE;
        
    // in init panel
    private JPanel currentPanel;
    
    private static Overview reference;
    
    private boolean fullscreen;
    
    // als de eerste par true is wordt er gewoon fullscr weergegeven
    // indien false, dan wordt er naar de andere parameters gekeken
    public Overview(boolean fullscreen, int width, int height)
    {
        STATE = STATE_SETUP;
        reference = this;
        this.fullscreen = fullscreen;
        
        // moet vrij vroeg, anders geeft het frame problemen omdatti al deels is geinit
        setUndecorated(true); // geen titelbalk
        
        // look and feel
        doLAF();
        
        // venstergrootte
        doScreenLayout(fullscreen, width, height);
        
        // JFrame
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setResizable(false);
        setLayout(new GridLayout());
        
        // TODO cursor weghalen
        // maak cursor van doorzichtige png
        BufferedImage cur = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
        setCursor(getToolkit().createCustomCursor(cur,new Point(0,0),""));
        
        // begin met startscherm
        currentPanel = new Init();
        getContentPane().add(currentPanel);
        
        // zonder dit is er alleen nog maar een fullscreen venster geinit
        setVisible(true);
    }
    
    // truuk die ik heb afgekeken om statisch een niet-statisch object te krijgen
    // zonder een functie van de parent (=Main) aan te hoeven roepen
    public static Overview getInstance()
    {
        return reference;
    }
    
    public void doScreenLayout(boolean fullscreen, int width, int height)
    {
        if (fullscreen)
        {
            fullscreen();
            
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            System.out.println("Fullscreen: " + d.getWidth() + "x" + d.getHeight());
        }
        
        // haal de resolutie uit de settings
        // dit kan een opgeslagen standaard zijn, of de beginwaarde
        else
        {
            setUndecorated(false);
            
            /*
            String res_setting = Settings.RESOLUTION;
            int[] resolution = Util.splitResolutionSetting(res_setting);
            setSize(resolution[0], resolution[1]);
             */
            
            setSize(width, height);
            
            System.out.println("Windowed: " + width + "x" + height);
        }
    }
    
    // native look
    public void doLAF()
    {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {}
    }
    
    public void fullscreen()
    {
        GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
      
        if ( device.isFullScreenSupported() ) 
        { 
            device.setFullScreenWindow(this);
        }
        else 
        { 
            System.err.println("Full screen not supported"); 
        }
    }
    
    public boolean isFullscreen()
    {
        return fullscreen;
    }
    
    public static int getGameState()
    {
        return STATE;
    }
    
    public static void setGameState(int newState)
    {
        STATE = newState;
    }
    
    public static boolean isInSetupState()
    {
        return STATE == STATE_SETUP;
    }
    
    public void showGamePanel()
    {
        setGameState(STATE_INGAME);
        setPanel(new GamePanel());
    }
    
    public void showScores()
    {
        setGameState(STATE_GAME_FINISH);
        setPanel(ScoreHolderPanel.getInstance());
    }
    
    public void showSetup()
    {
        setGameState(STATE_SETUP);
        setPanel(new Init());
    }
    
    private void setPanel(JPanel panel)
    {
        getContentPane().removeAll();
        currentPanel = panel;
        getContentPane().add(currentPanel);
        validate();
    }
    
    // op voorwaarde dat we ook echt in de setup zitten
    public Init getSetupPanel()
    {
        return (Init) currentPanel;
    }
    
    // op voorwaarde dat we ook echt in het spel zitten
    public GamePanel getGamePanel()
    {
        return (GamePanel) currentPanel;
    }
}
